const fs = require('fs');
const path = require('path');

let parser;
try {
  // 尝试加载@babel/parser
  parser = require('@babel/parser');
} catch (err) {
  console.error('错误: 请安装@babel/parser: npm install @babel/parser');
  process.exit(1);
}

/**
 * 使用Babel解析JavaScript代码并返回AST
 * 
 * 使用方式:
 * - 输入文件路径作为第一个参数
 * - 输出文件路径作为第二个参数(可选)
 */

// 读取命令行参数
const inputFile = process.argv[2];
const outputFile = process.argv[3];

if (!inputFile) {
  console.error('错误: 必须提供输入文件路径');
  process.exit(1);
}

try {
  // 读取JavaScript代码
  const code = fs.readFileSync(inputFile, 'utf-8');
  
  // 解析选项
  const options = {
    sourceType: 'unambiguous',  // 自动检测模块/脚本类型
    allowImportExportEverywhere: true,
    allowReturnOutsideFunction: true,
    allowAwaitOutsideFunction: true,
    allowUndeclaredExports: true,
    plugins: [
      'jsx',
      'typescript',
      'decorators-legacy',
      'classProperties',
      'dynamicImport',
      'exportDefaultFrom',
      'exportNamespaceFrom',
      'objectRestSpread',
      'optionalChaining',
      'nullishCoalescingOperator'
    ],
    locations: true,  // 启用位置跟踪
    errorRecovery: true  // 尝试从语法错误中恢复
  };

  // 解析代码
  const ast = parser.parse(code, options);
  
  // 输出AST
  const result = {
    success: true,
    ast: ast
  };
  
  if (outputFile) {
    // 输出到文件
    fs.writeFileSync(outputFile, JSON.stringify(result, null, 2));
  } else {
    // 输出到stdout
    console.log(JSON.stringify(result));
  }
  
  process.exit(0);
} catch (error) {
  // 处理错误
  const result = {
    success: false,
    error: {
      message: error.message,
      stack: error.stack,
      loc: error.loc
    }
  };
  
  if (outputFile) {
    fs.writeFileSync(outputFile, JSON.stringify(result, null, 2));
  } else {
    console.error(JSON.stringify(result));
  }
  
  process.exit(1);
}